package busterminal.entity;

import busterminal.entity.service.TripState;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Рейс (реализация)
 */
public class TripImplementation extends AbstractEntityImplementation implements Trip {

    /**
     * Маршрут, по которому осуществляется рейс
     */
    private Route route;
    /**
     * Состояние рейса, определяемое константой из {@link TripState}
     */
    private TripState tripState;
    /**
     * Дата осуществления рейса
     */
    private Date tripDate;
    /**
     * Автобус, который задействован в рейсе
     */
    private Bus bus;
    /**
     * Имя водителя
     */
    private String driverName;
    /**
     * Имя кондуктора
     */
    private String conductorName;

    /**
     * Конструктор по умолчанию
     */
    public TripImplementation() {
    }

    /**
     * Параметризованный конструктор
     * @param route маршрут, по которому осуществляется рейс
     * @param tripState состояние рейса, определяемое константой из {@link TripState}
     * @param tripDate дата осуществления рейса
     * @param bus автобус, который задействован в рейсе
     * @param driverName имя водителя
     * @param conductorName имя кондуктора
     */
    public TripImplementation(Route route, TripState tripState, Date tripDate, Bus bus, String driverName, String conductorName) {
        this.route = route;
        this.tripState = tripState;
        this.tripDate = tripDate;
        this.bus = bus;
        this.driverName = driverName;
        this.conductorName = conductorName;
    }

    /**
     * Параметризованный конструктор
     * @param route маршрут, по которому осуществляется рейс
     * @param tripState состояние рейса, определяемое константой из {@link TripState}
     * @param tripDate строка с датой осуществления рейса в формате <code>DD.MM.YYYY</code>
     * @param bus автобус, который задействован в рейсе
     * @param driverName имя водителя
     * @param conductorName имя кондуктора
     * @throws ParseException строка с датой не соответствует заданному формату
     */
    public TripImplementation(Route route, TripState tripState, String tripDate, Bus bus, String driverName, String conductorName) throws ParseException {
        this.route = route;
        this.tripState = tripState;
        this.tripDate = new SimpleDateFormat("dd.MM.yyyy").parse(tripDate);
        this.bus = bus;
        this.driverName = driverName;
        this.conductorName = conductorName;
    }

    /**
     * Получить автобус, который задействован в рейсе
     * @return автобус, который задействован в рейсе
     */
    @Override
    public Bus getBus() {
        return bus;
    }

    /**
     * Установить автобус, который задействован в рейсе
     * @param bus автобус, который задействован в рейсе
     */
    @Override
    public void setBus(Bus bus) {
        this.bus = bus;
    }

    /**
     * Получить имя кондуктора
     * @return имя кондуктора
     */
    @Override
    public String getConductorName() {
        return conductorName;
    }

    /**
     * Установить имя кондуктора
     * @param conductorName имя кондуктора
     */
    @Override
    public void setConductorName(String conductorName) {
        this.conductorName = conductorName;
    }

    /**
     * Получить имя водителя
     * @return имя водителя
     */
    @Override
    public String getDriverName() {
        return driverName;
    }

    /**
     * Установить имя водителя
     * @param driverName имя водителя
     */
    @Override
    public void setDriverName(String driverName) {
        this.driverName = driverName;
    }

    /**
     * Получить маршрут, по которому осуществляется рейс
     * @return маршрут, по которому осуществляется рейс
     */
    @Override
    public Route getRoute() {
        return route;
    }

    /**
     * Установить маршрут, по которому осуществляется рейс
     * @param route маршрут, по которому осуществляется рейс
     */
    @Override
    public void setRoute(Route route) {
        this.route = route;
    }

    /**
     * Получить состояние рейса, определяемое константой из {@link TripState}
     * @return состояние рейса, определяемое константой из {@link TripState}
     */
    @Override
    public TripState getTripState() {
        return tripState;
    }

    /**
     * Установить состояние рейса, определяемое константой из {@link TripState}
     * @param tripState состояние рейса, определяемое константой из {@link TripState}
     */
    @Override
    public void setTripState(TripState tripState) {
        this.tripState = tripState;
    }

    /**
     * Получить дату осуществления рейса
     * @return дата осуществления рейса
     */
    @Override
    public Date getTripDate() {
        return tripDate;
    }

    /**
     * Получить дату осуществления рейса
     * @return строка с датой осуществления рейса в формате <code>DD.MM.YYYY</code>
     */
    @Override
    public String getTripDateString() {
        return new SimpleDateFormat("dd.MM.yyyy").format(tripDate);
    }

    /**
     * Установить дату осуществления рейса
     * @param tripDate дата осуществления рейса
     */
    @Override
    public void setTripDate(Date tripDate) {
        this.tripDate = tripDate;
    }

    /**
     * Установить дату осуществления рейса
     * @param tripDate строка с датой осуществления рейса в формате <code>DD.MM.YYYY</code>
     */
    @Override
    public void setTripDate(String tripDate) throws ParseException {
        this.tripDate = new SimpleDateFormat("dd.MM.yyyy").parse(tripDate);
    }

    /**
     * Метод, возвращающий текстовое представление объекта
     * @return текстовое представление объекта
     */
    @Override
    public String toString() {
        return "TripImplementation{" + "id=" + getId() + ", route=" + route + ", tripState=" + tripState + ", tripDate=" + getTripDateString() + ", bus=" + bus + ", driverName=" + driverName + ", conductorName=" + conductorName + '}';
    }
}
